// import com.alibaba.druid.DbType;
// import com.alibaba.druid.sql.ast.SQLExpr;
// import com.alibaba.druid.sql.ast.SQLName;
// import com.alibaba.druid.sql.ast.SQLObject;
// import com.alibaba.druid.sql.ast.expr.SQLListExpr;
// import com.alibaba.druid.sql.ast.statement.*;
// import com.alibaba.druid.sql.dialect.mysql.ast.*;
// import com.alibaba.druid.sql.dialect.mysql.ast.clause.*;
// import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCaseStatement.MySqlWhenStatement;
// import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlCharExpr;
// import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlOutFileExpr;
// import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlUserName;
// import com.alibaba.druid.sql.dialect.mysql.ast.statement.*;
// import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateTableStatement.TableSpaceOption;
// import com.alibaba.druid.sql.repository.SchemaRepository;
// import com.alibaba.druid.sql.visitor.SchemaStatVisitor;
// import com.alibaba.druid.stat.TableStat;
// import com.alibaba.druid.stat.TableStat.Mode;
#pragma once
#include "../../../visitor/SchemaStatVisitor.h"
#include "MySqlASTVisitor.h"

class MySqlSchemaStatVisitor : virtual public SchemaStatVisitor, virtual public MySqlASTVisitor
{
public:
  MySqlSchemaStatVisitor();

  MySqlSchemaStatVisitor(SchemaRepository_ptr repository);

  bool visit(SQLSelectStatement_ptr x);

  // @Override
  DbType_ptr getDbType();

  // DUAL
  BOOL_ptr visit(MySqlDeleteStatement_ptr x);

  // @Override
  void endVisit(MySqlInsertStatement_ptr x);

  // @Override
  BOOL_ptr visit(MySqlInsertStatement_ptr x);

  // @Override
  BOOL_ptr visit(MySqlTableIndex_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlKey_ptr x);

  // @Override
  BOOL_ptr visit(MySqlPrimaryKey_ptr x);

  // @Override
  bool visit(SQLShowColumnsStatement_ptr x)
  {
    return false;
  }

  // @Override
  BOOL_ptr visit(MySqlShowDatabaseStatusStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlCreateExternalCatalogStatement_ptr x)
  {
    return BOOL::TRUE;
  }

  // @Override
  BOOL_ptr visit(MySqlCreateUserStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlPartitionByKey_ptr x);

  // @Override
  BOOL_ptr visit(MySqlUpdatePlanCacheStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlShowPlanCacheStatusStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlClearPlanCacheStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlDisabledPlanCacheStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlAlterDatabaseSetOption_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlAlterDatabaseKillJob_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlExplainPlanCacheStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlOutFileExpr_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlExplainStatement_ptr x);

  // @Override
  BOOL_ptr visit(MySqlUpdateStatement_ptr x);

  // @Override
  BOOL_ptr visit(MySqlSetTransactionStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlShowHMSMetaStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlShowAuthorsStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlShowBinaryLogsStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlShowMasterLogsStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlShowCollationStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlShowBinLogEventsStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlShowCharacterSetStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlShowContributorsStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlShowCreateDatabaseStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlShowCreateEventStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlShowCreateFunctionStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlShowCreateProcedureStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  bool visit(SQLShowCreateTableStatement_ptr x)
  {
    return false;
  }

  // @Override
  BOOL_ptr visit(MySqlShowCreateTriggerStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlShowEngineStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlShowEnginesStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlShowErrorsStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlShowEventsStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlShowFunctionCodeStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlShowFunctionStatusStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlShowGrantsStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlUserName_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlShowMasterStatusStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlShowOpenTablesStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlShowPluginsStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlShowPartitionsStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlShowPrivilegesStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlShowProcedureCodeStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlShowProcedureStatusStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlShowProcessListStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlShowProfileStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlShowProfilesStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlShowRelayLogEventsStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlShowRuleStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlShowRuleStatusStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlShowSlaveHostsStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlShowSequencesStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlShowSlowStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlShowSlaveStatusStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlShowTableStatusStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MysqlShowDbLockStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MysqlShowHtcStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MysqlShowStcStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlShowTriggersStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlShowTraceStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlShowBroadcastsStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlShowDdlStatusStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlShowDsStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlShowTopologyStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  bool visit(SQLShowVariantsStatement_ptr x)
  {
    return false;
  }

  // @Override
  BOOL_ptr visit(MySqlRenameTableStatement_Item_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlRenameTableStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlUseIndexHint_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlIgnoreIndexHint_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlLockTableStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlLockTableStatement_Item_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlUnlockTablesStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlForceIndexHint_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlAlterTableChangeColumn_ptr x);

  // @Override
  BOOL_ptr visit(MySqlAlterTableModifyColumn_ptr x);

  // @Override
  bool visit(SQLAlterCharacter_ptr x)
  {
    return false;
  }

  // @Override
  BOOL_ptr visit(MySqlAlterTableOption_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  bool visit(MySqlCreateTableStatement_ptr x);

  // @Override
  BOOL_ptr visit(MySqlHelpStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlCharExpr_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlUnique_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlAlterTableDiscardTablespace_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlAlterTableImportTablespace_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  // BOOL_ptr visit(TableSpaceOption_ptr x) {
  //     return BOOL::FALSE;
  // }

  // @Override
  BOOL_ptr visit(MySqlAlterTableAlterColumn_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlAlterTableForce_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlAlterTableLock_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlAlterTableOrderBy_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlAlterTableValidation_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlCaseStatement_ptr x);

  // @Override
  BOOL_ptr visit(MySqlSelectIntoStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlCaseStatement_MySqlWhenStatement_ptr x);

  // @Override
  BOOL_ptr visit(MySqlLeaveStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlIterateStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlRepeatStatement_ptr x);

  // @Override
  BOOL_ptr visit(MySqlCursorDeclareStatement_ptr x);

  // @Override
  BOOL_ptr visit(MySqlUpdateTableSource_ptr x);

  // @Override
  BOOL_ptr visit(MySqlSubPartitionByKey_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlSubPartitionByList_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlDeclareHandlerStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlDeclareConditionStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlFlushStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlEventSchedule_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlCreateEventStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlCreateAddLogFileGroupStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlCreateServerStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlCreateTableSpaceStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlAlterEventStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlAlterLogFileGroupStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlAlterServerStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlAlterTablespaceStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlChecksumTableStatement_ptr x)
  {
    return BOOL::TRUE;
  }

  // @Override
  BOOL_ptr visit(MySqlShowDatasourcesStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlShowNodeStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlShowHelpStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlFlashbackStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlShowConfigStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlShowPlanCacheStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlShowPhysicalProcesslistStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlRenameSequenceStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlCheckTableStatement_ptr x);

  // @Override
  BOOL_ptr visit(MysqlCreateFullTextCharFilterStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MysqlShowFullTextStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MysqlShowCreateFullTextStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MysqlAlterFullTextStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MysqlDropFullTextStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MysqlCreateFullTextTokenizerStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MysqlCreateFullTextTokenFilterStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MysqlCreateFullTextAnalyzerStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MysqlCreateFullTextDictionaryStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlAlterTableAlterFullTextIndex_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlExecuteForAdsStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlManageInstanceGroupStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlRaftMemberChangeStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlRaftLeaderTransferStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlMigrateStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlShowClusterNameStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlShowJobStatusStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlShowMigrateTaskStatusStatement_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlSubPartitionByValue_ptr x)
  {
    return BOOL::FALSE;
  }

  // @Override
  BOOL_ptr visit(MySqlExtPartition_ptr x)
  {
    return BOOL::TRUE;
  }

  // @Override
  BOOL_ptr visit(MySqlExtPartition_Item_ptr x)
  {
    return BOOL::FALSE;
  }
};
